package com.lazycat.leetcode.editor.cn;
//2023-06-03 21:08:39
//如果字符串中的所有字符都相同，那么这个字符串是单字符重复的字符串。 
//
// 给你一个字符串 text，你只能交换其中两个字符一次或者什么都不做，然后得到一些单字符重复的子串。返回其中最长的子串的长度。 
//
// 
//
// 示例 1： 
//
// 输入：text = "ababa"
//输出：3
// 
//
// 示例 2： 
//
// 输入：text = "aaabaaa"
//输出：6
// 
//
// 示例 3： 
//
// 输入：text = "aaabbaaa"
//输出：4
// 
//
// 示例 4： 
//
// 输入：text = "aaaaa"
//输出：5
// 
//
// 示例 5： 
//
// 输入：text = "abcdef"
//输出：1
// 
//
// 
//
// 提示： 
//
// 
// 1 <= text.length <= 20000 
// text 仅由小写英文字母组成。 
// 
//
// Related Topics 哈希表 字符串 滑动窗口 👍 168 👎 0

import java.util.HashMap;
import java.util.Map;

class SwapForLongestRepeatedCharacterSubstring {
    public static void main(String[] args) {
        //创建该题目的对象方便调用
        Solution solution = new SwapForLongestRepeatedCharacterSubstring().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int maxRepOpt1(String text) {
        Map<Character,Integer> map = new HashMap<>();
        int n = text.length();
        for(int i = 0;i<n;i++){
            char c = text.charAt(i);
            map.put(c,map.getOrDefault(c,0)+1);
        }

        int ans = 0;
        for(int i = 0;i<n;){

            int j = i;
            //找出当前连续
            while (j<n && text.charAt(j) == text.charAt(i)){
                j++;
            }

            //区间范围
            int size = j-i;

            if(size < map.getOrDefault(text.charAt(i),0) && (j<n || i>0)){
                ans = Math.max(ans,size+1);
            }

            //找到后一段连续的区间
            int k = j+1;

            while (k<n && text.charAt(k) == text.charAt(i)){
                k++;
            }
            ans = Math.max(ans,Math.min(k-i,map.getOrDefault(text.charAt(i),0)));
            i = j;
        }
        return ans;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}